﻿using System;
using System.Linq;
using Acamps.Framework.BancoDados;
using Acamps.Framework.SessionFactory;
using Acamps.Framework.Util;

namespace Acamps.Framework.NegocioRegras
{
    public class CampistaNegocio
    {
        private AcessoDados _acessoDados;
        private String _conectionString;
        private const string tipoParticipacaoInscrito = "#TipoParticipacao.Inscrito";

        internal CampistaNegocio(string conexao)
        {
            _conectionString = conexao;
            _acessoDados = new AcessoDados(conexao);
        }

        public Campista Salvar(Campista campista)
        {
            if (campista.Id == Guid.Empty)
            {
                campista.Id = Guid.NewGuid();
            }
            
            _acessoDados.Entidade.AddToCampistas(campista);

            _acessoDados.Entidade.SaveChanges();

            return campista;
        }

        public Campista AlteracaoCampista(Campista campista)
        {
            var campistaRet = _acessoDados.Entidade.Campistas.FirstOrDefault(x => x.Id == campista.Id);

            campistaRet.Nome = campista.Nome;
            campistaRet.Endereco = campista.Endereco;
            campistaRet.Fixo = campista.Fixo;
            campistaRet.Celular = campista.Celular;
            campistaRet.DataNascimento = campista.DataNascimento;
            campistaRet.Email = campista.Email;
            campistaRet.Apelido = campista.Apelido;
            campistaRet.Sexo = campista.Sexo;
            campistaRet.Cep = campista.Cep;
            campistaRet.Cidade = campista.Cidade;
            campistaRet.Bairro = campista.Bairro;
            campistaRet.Rg = campista.Rg;
            campistaRet.IdEstadoCivil = campista.IdEstadoCivil;
            campistaRet.IdTipoSanguineo = campista.IdTipoSanguineo;
            campistaRet.Cpf = campista.Cpf;

            _acessoDados.Entidade.SaveChanges();

            return campistaRet;
        }

        public Campista RecuperarCampista(Guid idCampista)
        {
            return _acessoDados.Entidade.Campistas.FirstOrDefault(x => x.Id == idCampista);
        }

        public Campista Salvar(Campista campista, Ficha ficha, Guid idAcampamento)
        {

            var acampamento = new Negocio(_conectionString).Acampamento.RecuperarEvento(idAcampamento);
            var tipoParticipacao = new Negocio(_conectionString).TipoParticipacao.RecuperarTipoParticipacaoPorReferencia(tipoParticipacaoInscrito);

            if (tipoParticipacao == null)
            {
                throw new Exception("Tipo Participação deve.");
            }

            if (campista == null)
            {
                throw new Exception("Objeto Campista não foi preenchido.");
            }

            if (ficha == null)
            {
                throw new Exception("Objeto Ficha não foi preenchido.");
            }

            if(acampamento == null)
            {
                throw new Exception("Acampamento indicado não foi localizado.");
            }

            try
            {
                campista.Id = Guid.NewGuid();

                _acessoDados.Entidade.AddToCampistas(campista);

                ficha.Id = Guid.NewGuid();
                ficha.IdCampista = campista.Id;
                ficha.IdEvento = acampamento.Id;
                ficha.IdTipoParticipacao = tipoParticipacao.Id;
                ficha.DtInclusao = DateTime.Now;
                _acessoDados.Entidade.AddToFichas(ficha);

                _acessoDados.Entidade.SaveChanges();
            }
            catch (Exception ex)
            {
            }
            return campista;
        }

        public IQueryable<Campista> ListarEquipe()
        {
            return _acessoDados.Entidade.Campistas.Where(x => x.Equipe == true);
        }
    }
}
